package ar.uba.fi.algo3.tp3.controlador;

import ar.uba.fi.algo3.titiritero.ControladorJuego;

import ar.uba.fi.algo3.tp3.modelo.Partida;
import ar.uba.fi.algo3.tp3.vista.VentanaPrincipal;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ControladorPacman extends ControladorJuego implements Serializable {
    private static ControladorPacman instance;
    private List<TecladoObservador> tecladoObservadores;
    private boolean detenido;

    private ControladorPacman() {
        super();
        detenido = false;
        tecladoObservadores = new ArrayList<TecladoObservador>();
    }

    public static ControladorPacman getInstance() {
        if(instance == null)
            instance = new ControladorPacman();
        return instance;
    }

    public void comenzarJuego() {
        estaEnEjecucion = true;
        try {
            while (estaEnEjecucion) {
                if(!detenido) {
                    simular();
                    dibujar();
                }
                Thread.sleep(intervaloSimulacion);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void informarDeError(String error) {
        VentanaPrincipal.mostrarError(error);
    }

    public void quitarObjetosVivos() {
        this.objetosVivos.clear();
    }

    public void quitarDibujables() {
        this.dibujables.clear();
    }

    public void despacharTeclado(int codigo) {
        TecladoObservador tecladoObservador;
        Iterator<TecladoObservador> iterador = this.tecladoObservadores.iterator();
        while (iterador.hasNext()) {
            tecladoObservador = iterador.next();
            tecladoObservador.teclaPresionada(codigo);
        }
    }

    public void agregarTecladoObservador(TecladoObservador obs) {
        this.tecladoObservadores.add(obs);
    }

    public void removerTecladoObservador(TecladoObservador obs) {
        this.tecladoObservadores.remove(obs);
    }

    public void cambiarEstadoPausa() {
    	if(!Partida.getInstance().isPerdida()){
    		if(detenido) {
    			this.detenido = false;
    		} else {
    			this.detenido = true;
    		}
    	}
    }

    public void forzarPausa(boolean pausa) {
        this.detenido = pausa;
    }
}
